#ifndef MESSAGESHOWAREA_H
#define MESSAGESHOWAREA_H

#include <QScrollArea>
#include <QWidget>
#include <QLabel>
#include <QPushButton>

#include "model/data.h"
//.h文件不宜进行 using namespace xxxx
using model::Message;

/////////////////////////////
///表示消息展示区
/////////////////////////////
class MessageShowArea : public QScrollArea
{
    Q_OBJECT
public:
    MessageShowArea();
    //尾插
    void addMessage(bool isLeft, const Message& message);
    //头插
    void addFrontMessage(bool isLeft, const Message& message);
    //清空消息
    void clear();
    //滚动到末尾
    void scrollToEnd();

private:
    QWidget* container;


};


//////////////////////////////
///表示一个消息元素
///里面要同时支持文本消息, 图片消息, 文件消息, 语音消息。
///当前只考虑文本消息
/////////////////////////////

class MessageItem : public QWidget
{
    Q_OBJECT

public:
    //此处isItem表示Item是否为左侧消息
    MessageItem(bool isLeft);

    //通过工厂方法创建MessageItem实例
    static MessageItem* makeMessageItem(bool isLeft, const Message& message);

    //添加工厂函数
    static QWidget* makeTextMessageItem(bool isLeft, const QString& text);
    static QWidget* makeImageMessageItem(bool isLeft, const QString& fileId, const QByteArray& content);
    static QWidget* makeFileMessageItem(bool isLeft, const Message& message);
    static QWidget* makeSpeechMessageItem(bool isLeft, const Message& message);

private:
    bool isLeft;
};

/////////////////////////////
///创建类表示文本消息的正文部分
/// 也让他表示文件消息
/////////////////////////////

class MessageContentLabel : public QWidget
{   Q_OBJECT
public:
    //fileName可以作为text的一部分,传递进来,不需要单独列一个参数
    MessageContentLabel(const QString& text, bool isLeft, model::MessageType messageType, const QString& fileId,
                        const QByteArray& content);
    void paintEvent(QPaintEvent* event) override;
    void updateUI(const QString& fileId, const QByteArray& fileContent);
    void mousePressEvent(QMouseEvent* event) override;
    void saveAsFile(const QByteArray& content);
    void playDone();

    void contextMenuEvent(QContextMenuEvent* event) override;
    void speechConvertTextDone(const QString& fileId, const QString& text);

private:
    QLabel* label;
    bool isLeft;

    model::MessageType messageType;
    QString fileId;
    QByteArray content;
    QString fileName;
    bool loadContentDone = false;


};

/////////////////////////////
///创建类表示图片消息的正文部分
/////////////////////////////

class MessageImageLabel : public QWidget{
    Q_OBJECT
public:
    MessageImageLabel(const QString& fileId, const QByteArray& content, bool isLeft);
    void updateUI(const QString& fileId, const QByteArray& content);
    //真正进行绘制图片到界面上的操作
    void paintEvent(QPaintEvent*  event);

private:
    QPushButton* imageBtn;
    //该图片在服务器对应的文件id。
    QString fileId;
    //图片的二进制数据
    QByteArray content;
    //是否为左侧消息
    bool isLeft;
};

#endif // MESSAGESHOWAREA_H
